WorkflowsからのHTTPリクエストがタイムアウトした時に調べたこと
発生した事象
- WorkflowsからCloud Functions関数をHTTPリクエストで呼び出して処理をしていたところ5分でタイムアウトになった
- Cloud Functions関数のタイムアウト上限は20分にしていた
原因
- WorkflowsのHTTPリクエスト(http.get,http.post,request)のタイムアウトのデフォルト値は5分(300秒)
経緯とわかったこと
経緯
WorkflowsのHTTPリクエスト方法のリファレンスを読んで、Cloud Functions関数へのHTTPリクエスト実装していました。
前述のリファレンスのタイムアウトに関しては以下の記載があり
TIMEOUT_IN_SECONDS: 省略可。例外がスローされるまでに、リクエストを実行できる時間(秒)。最大値は 1,800 秒です。
※引用:https://cloud.google.com/workflows/docs/http-requests
タイムアウト値の設定を省略した場合は最大1800秒まで待機するものと思い込んでおりました。
起きた事象
10分程度かかるCloud Functions関数をWorkflowsからhttp.get
で呼び出したところ関数の処理開始から5分後にWorkflows側で以下のエラーが発生しました。
request timed out
in step "processFunctions", routine "main", line: 4
{
"message": "request timed out",
"tags": [
"TimeoutError",
"OSError"
]
}
わかったこと
WorkflowsからHTTPリクエストを実行するときに用いるライブラリ http.get
、http.post
、request
のタイムアウトのデフォルト値は300秒でした。
http.get
、http.post
、request
のリファレンスを調べたところ、timeout
に関して以下の記載がありました。
The request timeout, in seconds (default: 300.0). If the request takes longer than the timeout, a TimeoutError is raised. The maximum allowed timeout is 1800 seconds.
リクエスト・タイムアウトを秒単位で指定します (デフォルト: 300.0)。リクエストにタイムアウト以上の時間がかかると、TimeoutErrorが発生します。最大許容タイムアウトは1800秒です。(DeepL翻訳)
対応策
300秒以上かかるHTTPリクエストを行う場合はtimeout
フィールドに300以上の数字を設定します。以下は設定例です。
main: steps: - processFunctions: call: http.post args: url: "関数のURL" auth: type: OIDC timeout: 500 result: processResul
上記yamlの実装では、指定した関数へのHTTPリクエストは500秒がタイムアウト上限となります。
反省点
Workflowsのリファレンスの中で、HTTPリクエスト方法の解説だけを読んで理解したつもりになってしまい、
実際にHTTPリクエストを実行するときに用いるhttp.get
などの標準ライブラリの仕様を確認しないまま使ってしまっていたため詰まってしまいました。最大値は1800秒とこちらに記載があったのでtimeoutフィールド省略時のタイムアウト上限は1800秒になると思い込んでいたことも原因です。
今後はもっと丁寧にリファレンスを追って実装をしていきたいと思います。